package geor.view;

import java.util.Calendar;
import java.util.GregorianCalendar;

import geor.app.R;
import geor.controller.OpcoesPagamento;
import geor.model.CompraHelper;
import android.app.AlertDialog;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CursorAdapter;
import android.widget.ListView;
import android.widget.TextView;
import lib.util.DateTimeUtils;
import lib.util.NumberUtils;
import lib.view.Holder;
import lib.view.SimpleActivity;

public class VerComprasActivity extends SimpleActivity {

	private CompraHelper helper = null;
	private Cursor model = null;
	private VerComprasAdapter adapter = null;
	private ListView listView = null;
	
	private Calendar calendar = null;
	private String textMesAno = null;
	
	private Button btMesSeguinte = null, btMesAnterior = null;
	private TextView tvMesAno = null;
	private Button btNovaCompra = null;
	
	private TextView tvComprasRestantes = null, tvTotalizador = null;
	
	private static final int MES_SEGUINTE = 1;
	private static final int MES_ANTERIOR = -1;
	private static final int MES_ATUAL = 0;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.ver_compras);
		
		calendar = new GregorianCalendar();
		textMesAno = DateTimeUtils.formatDate(calendar.getTime(), DateTimeUtils.ALT_MES_ANO);
		
		helper = new CompraHelper(this);
	}
	
	@Override
	protected void onStart() {
		super.onStart();
		load();
		set();
	}
	
	public boolean onCreateOptionsMenu(Menu menu) {
		new MenuInflater(this).inflate(R.menu.main_menu, menu);
		return super.onCreateOptionsMenu(menu);
	}
	
	public boolean onOptionsItemSelected(MenuItem item){
		if(item.getItemId()==R.id.menu_nova_receita){
			go(SalvarReceitaActivity.class);
			return true;
		} else if (item.getItemId() == R.id.menu_relatorios) {
			go(ListaRelatoriosActivity.class);
			return true;
		}
		return super.onOptionsItemSelected(item);
	}
	
	@Override
	public void createOrUpdate(ContentValues values) {
		
	}

	@Override
	public boolean delete(String id) {
		return false;
	}

	@Override
	public boolean validate(ContentValues values) {
		return false;
	}

	@Override
	public void load() {
		btNovaCompra = (Button) findViewById(R.id.bt_nova_compra);
		btMesAnterior = (Button) findViewById(R.id.bt_mes_anterior);
		btMesSeguinte = (Button) findViewById(R.id.bt_mes_seguinte);
		
		tvMesAno = (TextView) findViewById(R.id.tv_mes_ano);
		tvMesAno.setText(textMesAno);
		
		tvComprasRestantes = (TextView) findViewById(R.id.tv_compras_restantes);
		tvTotalizador = (TextView) findViewById(R.id.tv_totalizador);
		
		listView = (ListView) findViewById(R.id.lv_itens_compras);
		updateListView(MES_ATUAL);
	}

	@Override
	public void set() {
		btMesAnterior.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				updateListView(MES_ANTERIOR);
			}
		});

		btMesSeguinte.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				updateListView(MES_SEGUINTE);
			}
		});

		btNovaCompra.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				AlertDialog.Builder opcoes = new AlertDialog.Builder(
						VerComprasActivity.this);
				final String lista[] = { "À Vista", "A Prazo" };
				opcoes.setTitle("Opções de pagamento");
				opcoes.setItems(lista, new OpcoesPagamento(VerComprasActivity.this));
				opcoes.setNeutralButton("Cancelar", null);
				opcoes.show();
			}
		});
		
		listView.setOnItemClickListener(new OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				model.moveToPosition(position);
				try {
					helper.getDatabase().beginTransaction();
					String idContaPagar = model.getString(0); // 0 : id
					String idParcela = model.getString(5); // 5 : _id parcela
					// caso o valor na tabela seja TRUE (1) inverte o valor para salvar no banco.
					boolean foiPago = (model.getInt(7) == 1 ? false : true); // 7 : foi_pago
					double valorPago = 0;
					String dataPago = null;
					double saldo = model.getDouble(2); // 2 : valor
					
					if (foiPago) {
						valorPago = model.getDouble(2); // 2 : valor
						dataPago = "current_date";
						saldo *= -1; // caso a parcela tenha sido paga, inverte o valor do saldo
					}
					
					String[] params = {String.valueOf(NumberUtils.parseBoolean(foiPago)),
							String.valueOf(valorPago), dataPago, idParcela, idContaPagar};
					helper.getDatabase().execSQL("UPDATE contas_pagar_parcela SET foi_pago = ?," +
							"valor_pago = ?, data_pago = ? WHERE _id = ? AND contas_pagar_id = ?", params);
					
					helper.getDatabase().execSQL("UPDATE conta SET saldo = saldo + ? WHERE _id = ?",
							new String[]{String.valueOf(saldo), "1"}); // conta padrão : 1
					helper.getDatabase().setTransactionSuccessful();
				} catch (Exception e) {
					Log.e("VerComprasHolder", "update contas_pagar_parcela, conta", e);
					show("Ocorreu um erro ao salvar os dados.");
				} finally {
					helper.getDatabase().endTransaction();
				}
				updateListView(MES_ATUAL);
			}
		});
	}

	@Override
	public void populate(ContentValues values) {
	}
	
	private void updateListView(int irPara) {
		if (irPara != MES_ATUAL) {
			calendar.add(Calendar.MONTH, irPara);
			textMesAno = DateTimeUtils.formatDate(calendar.getTime(), DateTimeUtils.ALT_MES_ANO);
			tvMesAno.setText(textMesAno);
		}
		
		Cursor c = countItensRestantes();
		c.moveToFirst();
		//                                                    falta_pagar, total_itens
		tvComprasRestantes.setText(NumberUtils.itensRestantes(c.getInt(0), c.getInt(1)));
		tvTotalizador.setText("R$ " + NumberUtils.toRealFormat(c.getDouble(2))); // 2 : sum valor
		c.close();

		model = listarPorMesAno();
		startManagingCursor(model);
		adapter = new VerComprasAdapter(model);
		//adapter.notifyDataSetChanged();
		listView.setAdapter(adapter);
	}
	
	private Cursor countItensRestantes() {
		String date = DateTimeUtils.formatDate(calendar.getTime(),
				DateTimeUtils.DEF_MES_ANO);
		return helper.countItensRestantes(CompraHelper.WHERE_MES_ANO, new String[] {date});
	}
	
	private Cursor listarPorMesAno() {
		String date = DateTimeUtils.formatDate(calendar.getTime(),
				DateTimeUtils.DEF_MES_ANO);
		return helper.readAll(CompraHelper.WHERE_MES_ANO, new String[] {date});
	}

	/**
	 * Classe para auxiliar o Adapter a fazer cache dos dados.
	 * @author atila
	 *
	 */
	private static class VerComprasHolder extends Holder {

		private TextView descricao = null, valor = null;
		private CheckBox foiPago = null;
		
		public VerComprasHolder(View row) {
			super(row);
			descricao = (TextView) row.findViewById(R.id.tv_linha_descricao);
			valor = (TextView) row.findViewById(R.id.tv_linha_valor);
			foiPago = (CheckBox) row.findViewById(R.id.cb_verifica_pago);
		}

		@Override
		public void populate(Cursor c) {
			String desc = c.getString(1); // 1 : cp.descricao
			if (c.getInt(4) > 0) {
				desc += " (" + c.getInt(5) + ")"; // 5 : _id parcela, ou numero da parcela.
			}
			descricao.setText(desc);
			valor.setText("R$ " + NumberUtils.toRealFormat(c.getDouble(2))
					+ " - " + c.getString(6)); // 2 : cp.valor
			foiPago.setOnCheckedChangeListener(null);
			foiPago.setChecked(NumberUtils.isTrue(c.getString(7))); // 7 : cp.foi_pago
		}
	}
	
	/**
	 * Preenche a ListView com os dados obtidos do banco de dados.
	 * @author atila
	 *
	 */
	private class VerComprasAdapter extends CursorAdapter {

		public VerComprasAdapter(Cursor c) {
			super(VerComprasActivity.this, c);
		}

		@Override
		public View newView(Context context, Cursor cursor, ViewGroup vg) {
			LayoutInflater inflater = getLayoutInflater();
			View row = inflater.inflate(R.layout.linha_ver_compras, vg, false);
			VerComprasHolder holder = new VerComprasHolder(row);
			row.setTag(holder);
			return row;
		}
		
		@Override
		public void bindView(View view, Context context, Cursor cursor) {
			VerComprasHolder holder = (VerComprasHolder) view.getTag();
			holder.populate(cursor);
			//notifyDataSetChanged();
		}
	}
	
	@Override
	protected void onDestroy() {
		super.onDestroy();
		if (helper != null) {
			helper.close();
		}
	}
}
